package com.whfc.ms.api.fvs.service;

import com.whfc.common.result.ListData;
import com.whfc.common.result.PageData;
import com.whfc.fvs.dto.*;
import com.whfc.fvs.enums.FvsDevicePtzOption;
import com.whfc.fvs.enums.FvsDeviceStatus;
import com.whfc.fvs.param.FvsDeviceAddParam;
import com.whfc.fvs.param.FvsDeviceEditParam;
import com.whfc.fvs.param.FvsDeviceListParam;

import java.util.Date;
import java.util.List;

/**
 * @author : qzexing
 * @version : 1.0
 * @date : 2020-09-24 16:44
 */
public interface MsFvsDeviceService {

    /**
     * 获取视频设备列表
     *
     * @param fvsDeviceListParam 查询设备列表参数
     * @return 视频设备列表
     */
    PageData<FvsDeviceDTO> deviceList(FvsDeviceListParam fvsDeviceListParam);

    /**
     * 获取视频监控列表
     *
     * @param fvsDeviceListParam 查询监控列表参数
     * @return 视频监控列表
     */
    PageData<FvsDeviceDTO> list(FvsDeviceListParam fvsDeviceListParam);

    /**
     * 获取视频监控列表
     *
     * @param fvsDeviceListParam 查询监控列表参数
     * @return 视频监控列表
     */
    ListData<FvsDeviceDTO> listData(FvsDeviceListParam fvsDeviceListParam);

    /**
     * 根据平台获取设备列表
     *
     * @param platform 设备平台
     * @return List<FvsDeviceDTO>
     */
    List<FvsDeviceDTO> list(Integer platform);

    /**
     * 获取监控设备详情
     *
     * @param id 设备ID
     * @return 设备信息
     */
    FvsDeviceDTO detail(Integer id);

    /**
     * 添加监控设备
     *
     * @param deviceAddParam 添加设备param
     */
    void deviceAdd(FvsDeviceAddParam deviceAddParam);

    /**
     * 编辑监控设备
     *
     * @param deviceEditParam 修改设备param
     */
    void deviceEdit(FvsDeviceEditParam deviceEditParam);

    /**
     * 删除监控设备
     *
     * @param deviceId 设备ID
     */
    void delDevice(Integer deviceId);

    /**
     * 获取视频监控直播地址
     *
     * @param deviceId 设备ID
     * @return 视频监控流对象
     */
    FvsStreamDTO getStreamUrl(Integer deviceId);
    
    /**
     * 获取视频监控录像地址
     *
     * @param deviceId  设备ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 视频监控录像地址
     */
    ListData<FvsRecordDTO> getRecordList(Integer deviceId, Date startTime, Date endTime);

    /**
     * 获取直播地址列表
     *
     * @param deptId   组织机构ID
     * @param bizType  业务类型
     * @param platform 设备平台
     * @return 直播地址列表
     */
    List<FvsStreamDTO> listStreams(Integer deptId, Integer bizType, Integer platform);

    /**
     * 批量更新设备状态
     *
     * @param deviceIdList    设备ID列表
     * @param fvsDeviceStatus 设备状态
     */
    void batchUpdateDeviceStatus(List<Integer> deviceIdList, FvsDeviceStatus fvsDeviceStatus);

    /**
     * 根据国标ID查找设备
     *
     * @param gbId 国标ID
     * @return 设备信息
     */
    FvsDeviceDTO selectByGbId(String gbId);

    /**
     * 根据阿里设备ID查找设备
     *
     * @param aliDeviceId 阿里设备ID
     * @return 设备信息
     */
    FvsDeviceDTO selectByAliDeviceId(String aliDeviceId);

    /**
     * 根据阿里流ID查找设备
     *
     * @param aliStreamId 阿里流ID
     * @return 设备信息
     */
    FvsDeviceDTO selectByAliStreamId(String aliStreamId);

    /**
     * 根据国标ID更新设备截图
     *
     * @param gbId        国标ID
     * @param snapshotUrl 截图地址
     */
    void updateSnapshotUrlByGbId(String gbId, String snapshotUrl);

    /**
     * 根据阿里设备ID更新设备信息
     *
     * @param aliDeviceId  阿里设备ID
     * @param deviceStatus 设备状态
     * @param streamStatus 流状态
     */
    void updateByAliDeviceId(String aliDeviceId, Integer deviceStatus, Integer streamStatus);

    /**
     * 根据阿里流ID更新设备信息
     *
     * @param aliStreamId  阿里流ID
     * @param deviceStatus 设备状态
     * @param streamStatus 流状态
     * @param snapshotUrl  截图地址
     */
    void updateByAliStreamId(String aliStreamId, Integer deviceStatus, Integer streamStatus, String snapshotUrl);

    /**
     * 设备云台操作
     *
     * @param deviceId        设备ID
     * @param devicePtzOption 云台操作
     */
    void ptz(Integer deviceId, FvsDevicePtzOption devicePtzOption);

    /**
     * 获取视频监控token
     *
     * @param deptId   组织机构ID
     * @param platform 监控平台
     * @return token
     */
    FvsTokenDTO getToken(Integer deptId, Integer platform);

    /**
     * 获取项目视频列表
     *
     * @param deptId
     * @return
     */
    List<FvsVideoDTO> getVideoList(Integer deptId);

    /**
     * 视频日志
     *
     * @param deptId
     * @param date
     * @return
     */
    FvsLogDTO log(Integer deptId, Date date);
}
